MinimalGL: カメラコントロール
#MinimalGL #カメラ
MinimalGLでは、カメラをインタラクティブに制御することができます
コード
See: https://github.com/yosshin4004/minimal_gl/blob/build_2025_12_23/examples/07_camera_and_cubemap.gfx.glsl
カメラの状態は、以下の tanFovY と cameraInWorld で取得できる
code:glsl
layout(location = 6) uniform float tanFovY;
layout(location = 7) uniform mat4 cameraInWorld;
レイキャストで使う
レイキャスト(レイマーチング・パストレーシングなど)でこの値を使う場合のコード
中心が0・縦横比が1のスクリーン座標 p を用いて、以下のように書ける
code:glsl
vec3 ro = cameraInWorld3.xyz;
vec3 rd = mat3(cameraInWorld) * normalize(vec3(p * tanFovY, -1));
See also: レイトレーシング: レイ
⚠️.icon build_2025_12_23現在: tanFovYについて、本来は$ \tan(FOV)ではなく$ \tan(FOV/2)を使いたい箇所である点に注意。一旦、UI上の "fovY" に半分の値を指定する形で使おう
カメラの変化を検知する
カメラ情報の変化を検知する手順
極めて雑にやるなら、
tanFovY と cameraInWorld を用いてハッシュ値を計算し、
ハッシュ値を左下1ピクセルに状態として格納し、
texelFetch を行い、現フレームのハッシュ値と1フレーム前のハッシュ値の比較を行う
ハッシュ値の計算にはpcg3dとか使うと良いですよ
code:glsl
vec3 cameraStateHash = hash3f(
cameraInWorld0.xyz
+ cameraInWorld1.xyz
+ cameraInWorld2.xyz
+ cameraInWorld3.xyz
+ tanFovY
);
if (floor(gl_FragCoord.xy) == vec2(0)) {
outColor = vec4(cameraStateHash, 1.0);
return;
}
bool isCameraChanged = length(cameraStateHash - texelFetch(backBuffer, ivec2(0), 0).xyz) > 0.01;
操作方法
左クリックでドラッグで上下左右に移動
右クリックでドラッグで回転
ホイールで前後に移動